<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    function objectCreate(proto){
        if(proto !== null && typeof proto !== 'object' && typeof proto !== 'function'){
            throw new TypeError('格式错误')
        }
        function F(){}
        F.prototype = proto
        let obj = new F()
        if (proto === null){
            obj.__proto__ = proto
        }
        return obj
    }
		// 测试 1：以普通对象为原型
const protoObj = { name: 'proto' };
const obj1 = objectCreate(protoObj);
console.log(Object.getPrototypeOf(obj1) === protoObj); // 应输出 true

// 测试 2：以 null 为原型
const obj2 = objectCreate(null);
console.log(Object.getPrototypeOf(obj2)); // 应输出 null
console.log(obj2.toString);               // 应输出 undefined（无继承属性）

    // 测试 3：原型链继承属性
const parent = { value: 100 };
const child = objectCreate(parent);
console.log(child.value); // 应输出 100（继承自原型）

    // 测试 4：以函数作为原型
function Foo() {}
const obj3 = objectCreate(Foo);
console.log(Object.getPrototypeOf(obj3) === Foo); // 应输出 true

// 测试 5：以数组作为原型
const arrProto = [1, 2, 3];
const obj4 = objectCreate(arrProto);
console.log(Object.getPrototypeOf(obj4) === arrProto); // 应输出 true

    // 测试 6：传入非对象/非 null 的原始值（应抛错）
try {
    objectCreate(123); // 数字类型
} catch (e) {
    console.log(e.message); // 应输出 "格式错误"
}

try {
    objectCreate("string"); // 字符串类型
} catch (e) {
    console.log(e.message); // 应输出 "格式错误"
}

// 测试 7：行为一致性验证
const protoA = { key: 'value' };
const myObj = objectCreate(protoA);
const nativeObj = Object.create(protoA);
console.log(
    Object.getPrototypeOf(myObj) === Object.getPrototypeOf(nativeObj) // 应输出 true
);

</script>
</html>